#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

        
void PrintfPending(const sigset_t &pending)
{
    std::cout << "curr pending list [" << getpid() << "]: ";
    for (int signo = 31; signo > 0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void non_handler(int signo)
{

}

int main()
{
    ::signal(2, non_handler);
    //::signal(2, SIG_IGN);

    //1. 对2信号进行屏蔽
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);

    //1.1添加信号
    //只是在用户栈上设置了block的位图结构里，并没有设置进入内核中
    sigaddset(&block, 2);
    //1.2 设置进内核中
    sigprocmask(SIG_SETMASK, &block, &oblock);

    int cnt = 0;
    while(true)
    {
        // 2. 如何获取喷丁表呢？
        sigset_t pending;
        sigpending(&pending);

        //2.1 打印
        PrintfPending(pending);
        sleep(1);
        
        cnt++;
        if (cnt == 10)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK, &oblock, nullptr);
        }
    }

    return 0;
}





// void handler(int signo)
// {
//     std::cout << "get a new signal: " << signo << std::endl;
//     exit(1);
// }


// int main()
// {
//     //信号捕捉：
//     //1.默认
//     //2.忽略
//     //3.自定义捕捉
//     //::signal(2, handler);
//     ::signal(2, SIG_IGN); //忽略
//     ::signal(2, SIG_DFL); //默认
//     while(true)
//     {
//         pause();
//     }

// }


// void handler(int signo)
// {
//     std::cout << "get a signo: " << signo << std::endl;
//     //捕捉11号信号，不执行默认动作，进程没有退出
// }

// int main()
// {
//     signal(11, handler);
//     int *p = nullptr;
//     *p = 100;

//     while(true);
// }


// using func_t = std::function<void()>;

// int gcount = 0;
// std::vector<func_t> gfuncs;

// void handler(int signo)
// {
//     for(auto &f: gfuncs)
//     {
//         f();
//     }
//     std::cout << "gcount: " << gcount << std::endl;
//     alarm(1);
// }

// //操作系统运行原理
// int main()
// {
//     gfuncs.push_back([]()
//                      { std::cout << "我是一个内核刷新任务" << std::endl; });

//     gfuncs.push_back([]()
//                      { std::cout << "我是一个检测进程时间片的操作，如果时间片到了，我会切换进程" << std::endl; });

//     gfuncs.push_back([]()
//                      { std::cout << "我是一个内存管理操作，定期清理操作系统内核进程" << std::endl; });

//     alarm(1);
//     signal(SIGALRM, handler);

//     while (true)
//     {
//         pause();
//         std:: cout << "我醒来了..." <<std::endl;
//         gcount++;
//     }
// }

// void Handler(int signo)
// {
//     //当对应的信号被触发，内核会将对应的信号编号，传递给自定义方法
//     std::cout << "Get a signal number is: " << signo << std::endl;
// }

// int number = 0;

// void die(int signumber)
// {
//     printf("get a sig: %d, count: %d\n", signumber, number);
//     exit(0);
// }

// int main()
// {
//     alarm(10);//会在1s之后收到一个SIGALRM信号

//     sleep(4);
//     int n = alarm(0);
//     std::cout << "n: " << n <<std::endl;

//     //signal(SIGALRM, die);
//     // while(true)
//     // {
//     //     number++;
//     //     //printf("count: %d\n", number++);
//     // }

//     // signal(SIGQUIT, Handler); // 默认终止 -> 执行自定义方法： Handle

//     // while(true)
//     // {
//     //     std::cout << "hello linux" << std::endl;
//     //     sleep(1);
//     // }

//     return 0;
// }
